package com.demo;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.Arrays;

/**
 * @author chenyuan
 * @date 2020/10/17 15:22
 */
// 代码自动生成
public class CodeGeneration {
	public static void main(String[] args) {
		// 1. 需要构建一个 代码自动生成器对象
		AutoGenerator generator = new AutoGenerator();
		// 2. 配置策略
		// 2.1全局配置,一定要是 com.baomidou.mybatisplus.generator.config.GlobalConfig 这个包下的
		GlobalConfig globalConfig = new GlobalConfig();
		//    获取当前系统根目录
		String property = System.getProperty("user.dir");
		//    配置输出目录
		globalConfig.setOutputDir(property + "/src/main/java");
		//    配置作者
		globalConfig.setAuthor("chenyuan");
		//    是否打开资源管理器
		globalConfig.setOpen(false);
		//    是否覆盖原来生成的
		globalConfig.setFileOverride(false);
		//    去 Service 接口的 I 前缀
		globalConfig.setServiceName("%sService");
		//    实体类主键生成策略
		globalConfig.setIdType(IdType.ID_WORKER);
		//    日期的类型
		globalConfig.setDateType(DateType.ONLY_DATE);
		//    Swagger2
		globalConfig.setSwagger2(true);
		//    把全局配置放入自动生成器
		generator.setGlobalConfig(globalConfig);

		// 2.2 设置数据源
		DataSourceConfig sourceConfig = new DataSourceConfig();
		sourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC")
				.setDriverName("com.mysql.cj.jdbc.Driver")
				.setDbType(DbType.MYSQL)
				.setUsername("root")
				.setPassword("123456");
		generator.setDataSource(sourceConfig);

		// 2.3 包的配置
		PackageConfig packageConfig = new PackageConfig();
		packageConfig.setModuleName("demo")// 配置模块信息
				.setParent("com")
				.setEntity("pojo")// 实体类包名
				.setMapper("mapper")// mapper 包名
				.setService("service")
				.setServiceImpl("serviceImpl")
				.setController("controller");
		generator.setPackageInfo(packageConfig);

		// 2.4 策略配置
		StrategyConfig strategy = new StrategyConfig();

		strategy.setInclude("user");// 映射数据库表

		strategy.setNaming(NamingStrategy.underline_to_camel)// 配置 下划线可以转换驼峰命名
				.setColumnNaming(NamingStrategy.underline_to_camel)
				.setEntityLombokModel(true)// 支持 lombok
				.setRestControllerStyle(false)// 自动配置 Rest 驼峰命名格式
				.setLogicDeleteFieldName("deleted")// 配置逻辑删除的标志名
				.setVersionFieldName("version");// 乐观锁配置

		// 自动填充策略
		TableFill gmt_created = new TableFill("gmt_created", FieldFill.INSERT);
		TableFill gmt_modified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
		strategy.setTableFillList(Arrays.asList(gmt_created, gmt_modified));


		// 3. 执行 自动生成策略
		generator.execute();
	}
}
